package cn.kgc.springday05.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author 课工场
 * @date 2023/10/10
 * @description   jdk的动态代理    生成对象的代理对象
 */
public class JDKProxy {

    // 被代理对象
    private Object target;

    public JDKProxy(Object target){
        this.target = target;
    }


    /**
     * 获取代理对象的方法
     * ClassLoader loader        类加载器  虚拟机不会为动态生成的类分配类加载器
     * Class<?>[] interfaces    被代理对象实现的所有接口
     * InvocationHandler        业务增强代码的封装位置
     *
     * @return
     */
    public  Object  getTargetProxy(){

        //  类加载器  生成对象
        ClassLoader classLoader = this.getClass().getClassLoader();

        // 获取被代理对象实现的所有接口
        Class<?> clazz = target.getClass();
        Class<?>[] interfaces = clazz.getInterfaces();

        InvocationHandler  invocationHandler = new InvocationHandler() {

            /*
                Object proxy   代理对象
                Method method  方法对象     代理对象所调用的方法对象
                Object[] args  参数数组     代理对象所调用的方法传入的参数
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                String methodName = method.getName();
                System.out.println("methodName = " + methodName);

                // 被代理对象方法的执行
                try {
                    //  连接点
                    System.out.println("==============上课时间到了================");

                    Object invoke = method.invoke(target, args);

                    //  连接点
                    System.out.println("==============下课时间到了================");

                    return invoke;
                }catch (Exception e){
                    //  连接点

                }finally {
                    //  连接点

                }

                return null;
            }
        };

        Object o = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);

        return o;
    }

}
